package com.edata.bigdata.algorithm.networks

import org.apache.spark.graphx.{EdgeTriplet, VertexId}

/*
* @author：Alan Sword
* @usage：基础接口，所有图算法都会继承，用于预定义基于Pregel实现的图算法需要用到的方法
* */
trait Pregel[T] {

  /*
  * @usage：一个节点可能会接收到来自多个相邻节点的消息，到接收之前，先调用此方法对消息进行merge
  * @params：如果merge是第一次进行，则msg1和msg2都是来自相邻节点的消息，否则，msg1来自前一次merge操作的结果
  *          merge操作是针对来自多个相邻节点的消息两两进行的。
  * */
  def mergeMsgs(msg1: T, msg2: T): T

  /*
  * @usage：发送消息的逻辑是围绕每个A->B进行的
  * @params：
  * */
  def sendMsg(edge: EdgeTriplet[T, _]): Iterator[(VertexId, T)]


  /*
  * @usage：节点接收到最终merge后的消息，此方法是接收消息后的处理逻辑，
  * */
  def handleMsg(vId: VertexId, vAttr: T, msg: T): T
}
